import { MongodbClient } from "../lib/db.client.mongodb";
import { PgClient } from "../lib/db.client.pg";

import { ENUM_PASTER, Paster, User } from "qqlx-core";
import { getConditionMatchStr, PasterSchema } from "qqlx-cdk";

import { User as OldUser } from "../../../qqlx.old/qqlx-core";
import { Corp as OldCorp } from "../../../qqlx.old/qqlx-core";
import { Warehouse as OldWarehouse } from "../../../qqlx.old/qqlx-core";
import { Config as OldConfig } from "../../../qqlx.old/qqlx-core";

import { PasterDao } from "../dao/pond";
import { ObjectId } from "mongodb";

export async function doBrandInsert(corpId: string, user_old_new_map: Map<OldUser["_id"], User>) {
  const mongodbClient = new MongodbClient("mongodb://localhost:27017/qqlx");
  const pgClient = new PgClient("127.0.0.1", "5432", "production", "postgres", "postgres");

  console.group("\n开始迁移mongo公司/仓库数据");
  const stat = { before: 0, wanner: 0, now: 0 };

  try {
    await mongodbClient.start();
    const mongo_corp = mongodbClient.getCollection("corps");
    const mongo_config = mongodbClient.getCollection("configs");
    const mongo_warehouses = mongodbClient.getCollection("warehouses");

    const mongo_master_corp = (await mongo_corp.findOne<OldCorp>({ _id: corpId as unknown as ObjectId })) as OldCorp;

    const mongo_master_corp_query = { corpId: mongo_master_corp._id as unknown as ObjectId };
    const configs = await mongo_config.find<OldConfig>(mongo_master_corp_query).toArray();
    const wares = await mongo_warehouses.find<OldWarehouse>({ ...mongo_master_corp_query, isDisabled: false }).toArray();

    console.log("旧数据（公司）", mongo_master_corp._id, mongo_master_corp.name);
    console.log(
      "旧数据（公司别称）",
      configs.length,
      configs.map((d) => d.titles),
    );
    console.log("旧数据（仓库）", wares.length);
    stat.wanner = 1 + configs.length + wares.length;

    // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░▄█▀▀▀▀▀█▄░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░▄█░░▄▄▄░░█▄░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▄▄█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░▀▄▀▄▄▄▄▄▀▄▀░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

    const pgClientIns = await pgClient.start();
    const pasterDao = new PasterDao(pgClientIns.getRepository<Paster>(PasterSchema));

    const master = user_old_new_map.get(mongo_master_corp.userId) as User;
    const condis = [getConditionMatchStr("refOwnerUUid32", master.uuid32)];
    const pasterCount = await pasterDao.count(condis);
    stat.before = pasterCount;

    if (pasterCount === 0) {
      const schemaLs: Paster[] = [];

      const schema1 = getPasterFromOld(master.uuid32, mongo_master_corp.name, mongo_master_corp.timeCreate);
      schema1.desc = mongo_master_corp.contact;
      schema1.content = mongo_master_corp.address;
      schema1.type = ENUM_PASTER.CORP;
      schemaLs.push(schema1);

      schemaLs.push(
        ...configs.reduce((init, curr) => {
          const ls = curr.titles.split(",").filter((d) => !!d);
          const lls = ls.map((title) => {
            const _schema = getPasterFromOld(master.uuid32, title, curr.timeCreate);
            _schema.type = ENUM_PASTER.CORP;
            return _schema;
          });
          return init.concat(lls);
        }, [] as Paster[]),
      ); // 副公司名

      schemaLs.push(
        ...wares.map((ware) => {
          const schema3 = getPasterFromOld(master.uuid32, ware.name, ware.timeCreate);
          schema3.content = ware.address;
          schema3.type = ENUM_PASTER.ESTATE;
          return schema3;
        }),
      ); // 仓库

      await pasterDao.insertMany(schemaLs);
    }

    // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░░░▄▄▄▄▄▄░░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░▄█▀▀▀▀▀█▄░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░▄█░░▄▄▄░░█▄░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▀▀█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░█░░█▄▄█░░█░░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░▀▄▀▄▄▄▄▄▀▄▀░░░░░░░░░░░░░░░░░░░░░░░░░░
    // ░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░

    const pgCountFinal = await pasterDao.count(condis);
    stat.now = pgCountFinal;

    console.log(`🔴迁移前 >> 迁移后 / pond_asser_paster`, stat.before, stat.now);
    console.log(`期望`, stat.wanner);
    console.log(`📉误差`, stat.now - stat.before - stat.wanner);
    console.groupEnd();
    console.log("====================================");
  } finally {
    await pgClient.stop();
    await mongodbClient.stop();
  }
}

function getPasterFromOld(masterId: User["uuid32"], name: string, time: number) {
  const schema = new PasterSchema();
  schema.refOwnerUUid32 = masterId;
  schema.name = name;
  schema.remark = "由系统自动生成";
  schema.timeCreate = time.toString();
  schema.timeUpdate = time.toString();
  return schema;
}
